<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
<meta name="viewport"
      content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">

    <meta name="author" content="豆豆">


    <meta name="subtitle" content="愿望是实现睡觉自由">


    <meta name="description" content="你来啦，这里是豆豆的小笔记！">


    <meta name="keywords" content="豆豆,学习,小笔记,睡觉自由">


<title>「AI_05」误差的来源 | 豆豆的小笔记</title>



    <link rel="icon" href="/favicon.ico">




    <!-- stylesheets list from _config.yml -->
    
    <link rel="stylesheet" href="/css/style.css">
    



    <!-- scripts list from _config.yml -->
    
    <script src="/js/script.js"></script>
    
    <script src="/js/tocbot.min.js"></script>
    



    
    
        
            <!-- MathJax配置，可通过单美元符号书写行内公式等 -->
<script type="text/x-mathjax-config">
    MathJax.Hub.Config({
    "HTML-CSS": {
        preferredFont: "TeX",
        availableFonts: ["STIX","TeX"],
        linebreaks: { automatic:true },
        EqnChunk: (MathJax.Hub.Browser.isMobile ? 10 : 50)
    },
    tex2jax: {
        inlineMath: [ ["$", "$"], ["\\(","\\)"] ],
        processEscapes: true,
        ignoreClass: "tex2jax_ignore|dno",
        skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code']
    },
    TeX: {
        equationNumbers: { autoNumber: "AMS" },
        noUndefined: { attributes: { mathcolor: "red", mathbackground: "#FFEEEE", mathsize: "90%" } },
        Macros: { href: "{}" }
    },
    messageStyle: "none"
    });
</script>
<!-- 给MathJax元素添加has-jax class -->
<script type="text/x-mathjax-config">
    MathJax.Hub.Queue(function() {
        var all = MathJax.Hub.getAllJax(), i;
        for(i=0; i < all.length; i += 1) {
            all[i].SourceElement().parentNode.className += ' has-jax';
        }
    });
</script>
<!-- 通过连接CDN加载MathJax的js代码 -->
<script type="text/javascript" async
        src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML">
</script>


        
    


<meta name="generator" content="Hexo 4.2.0"></head>
<body>
    <div class="wrapper">
        <header>
    <nav class="navbar">
        <div class="container">
            <div class="navbar-header header-logo"><a href="/">豆豆的小笔记</a></div>
            <div class="menu navbar-right">
                
                    <a class="menu-item" href="/archives">归档</a>
                
                    <a class="menu-item" href="/category">分类</a>
                
                    <a class="menu-item" href="/tag">标签</a>
                
                    <a class="menu-item" href="/about">关于</a>
                
                <input id="switch_default" type="checkbox" class="switch_default">
                <label for="switch_default" class="toggleBtn"></label>
            </div>
        </div>
    </nav>

    
    <nav class="navbar-mobile" id="nav-mobile">
        <div class="container">
            <div class="navbar-header">
                <div>
                    <a href="/">豆豆的小笔记</a><a id="mobile-toggle-theme">·&nbsp;纯白</a>
                </div>
                <div class="menu-toggle" onclick="mobileBtn()">&#9776; 菜单</div>
            </div>
            <div class="menu" id="mobile-menu">
                
                    <a class="menu-item" href="/archives">归档</a>
                
                    <a class="menu-item" href="/category">分类</a>
                
                    <a class="menu-item" href="/tag">标签</a>
                
                    <a class="menu-item" href="/about">关于</a>
                
            </div>
        </div>
    </nav>

</header>
<script>
    var mobileBtn = function f() {
        var toggleMenu = document.getElementsByClassName("menu-toggle")[0];
        var mobileMenu = document.getElementById("mobile-menu");
        if(toggleMenu.classList.contains("active")){
           toggleMenu.classList.remove("active")
            mobileMenu.classList.remove("active")
        }else{
            toggleMenu.classList.add("active")
            mobileMenu.classList.add("active")
        }
    }
</script>
        <div class="main">
            <div class="container">
    
    
        <div class="post-toc">
    <div class="tocbot-list">
    </div>
    <div class="tocbot-list-menu">
        <a class="tocbot-toc-expand" onclick="expand_toc()">展开所有</a>
        <a onclick="go_top()">回到顶部</a>
        <a onclick="go_bottom()">到达底部</a>
    </div>
</div>

<script>
    document.ready(
        function () {
            tocbot.init({
                tocSelector: '.tocbot-list',
                contentSelector: '.post-content',
                headingSelector: 'h1, h2, h3, h4, h5',
                collapseDepth: 1,
                orderedList: false,
                scrollSmooth: true,
            })
        }
    )

    function expand_toc() {
        var b = document.querySelector(".tocbot-toc-expand");
        tocbot.init({
            tocSelector: '.tocbot-list',
            contentSelector: '.post-content',
            headingSelector: 'h1, h2, h3, h4, h5',
            collapseDepth: 6,
            orderedList: false,
            scrollSmooth: true,
        });
        b.setAttribute("onclick", "collapse_toc()");
        b.innerHTML = "收起所有"
    }

    function collapse_toc() {
        var b = document.querySelector(".tocbot-toc-expand");
        tocbot.init({
            tocSelector: '.tocbot-list',
            contentSelector: '.post-content',
            headingSelector: 'h1, h2, h3, h4, h5',
            collapseDepth: 1,
            orderedList: false,
            scrollSmooth: true,
        });
        b.setAttribute("onclick", "expand_toc()");
        b.innerHTML = "展开所有"
    }

    function go_top() {
        window.scrollTo(0, 0);
    }

    function go_bottom() {
        window.scrollTo(0, document.body.scrollHeight);
    }

</script>
    

    
    <article class="post-wrap">
        <header class="post-header">
            <h1 class="post-title">「AI_05」误差的来源</h1>
            
                <div class="post-meta">
                    

                    
                        <span class="post-time">
                        时间： <a href="#">三月 13, 2017&nbsp;&nbsp;22:00:44</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                        </span>
                    
                    
                        <span class="post-category">
                    分类：
                            
                                <a href="/categories/AI/">AI</a>
                            
                        </span>
                    
                </div>
            
        </header>

        <div class="post-content">
            <p><img src="chapter5-1.png" alt=""></p>
<p>从上节课测试集数据来看，Average Error随着模型复杂增加呈指数上升趋势，更复杂的模型并不能给测试集带来更好的效果。</p>
<p>而这些Error的主要有<strong>两个来源</strong>，分别是<strong>bias（偏差）和variance（方差）</strong>。</p>
<p><img src="001.jpg" alt=""></p>
<h1 id="估测"><a href="#估测" class="headerlink" title="估测"></a>估测</h1><p>假设真实的模型为 $\hat f$ ， 如果我们知道 $\hat f$ 模型，那是最好不过了，但是 $\hat f$ 只有 Niamtic 公司才知道。</p>
<p><img src="chapter5-2.png" alt=""></p>
<p>所以我们只能通过收集 Pokemon精灵 的数据，然后通过 step1~step3 训练得到我们的理想模型 $f^<em>$，$f^</em>$ 其实是  $\hat f$ 的一个预估。</p>
<p><img src="chapter5-3.png" alt=""></p>
<p>这个过程就像打靶，$\hat f$ 就是我们的靶心，$f^<em>$ 就是我们投掷的结果。如上图所示，$\hat f$ 与  $f^</em>$ 之间蓝色部分的差距就是偏差和方差导致的。</p>
<h2 id="估测变量x的偏差和方差"><a href="#估测变量x的偏差和方差" class="headerlink" title="估测变量x的偏差和方差"></a>估测变量x的偏差和方差</h2><h3 id="估测x的偏差"><a href="#估测x的偏差" class="headerlink" title="估测x的偏差"></a>估测x的偏差</h3><ul>
<li>假设 $x$ 的平均值是  $\mu$，方差为 $\sigma^2$</li>
</ul>
<p>评估平均值要怎么做呢？</p>
<ul>
<li><p>首先拿到 $N$ 个样本点：${x^1,x^2,···,x^N}$</p>
</li>
<li><p>计算平均值 $m$, 得到</p>
</li>
</ul>
<p>$$<br>m = \frac{1}{N} \sum_{n} x^n \neq \mu<br>$$</p>
<p><img src="chapter5-4.png" alt=""></p>
<p>但是如果计算很多组的 $m$ ，然后求 $m$ 的期望：</p>
<p>$$<br>E[m]=E\left[\frac{1}{N}\sum x^n\right]=\frac{1}{N}\sum_nE\left[x^n\right]=\mu<br>$$</p>
<p>这个估计是<strong>无偏估计（unbiased）</strong>。</p>
<p>然后 $m$ 分布对于 $\mu$ 的离散程度（方差）：</p>
<p>$$<br>Var[m]=\frac{\sigma^2}{N}<br>$$</p>
<p>这个取决于 $N$，下图看出 $N$ 越小越离散：</p>
<p><img src="chapter5-5.png" alt=""></p>
<h3 id="估测变量x的方差"><a href="#估测变量x的方差" class="headerlink" title="估测变量x的方差"></a>估测变量x的方差</h3><p>如何估算方差呢？</p>
<p>首先根据前一节计算出来很多个$m$，然后计算每个值对应的$s^2$<br>$$<br>s^2 = \frac{1}{N} \sum_{n} \left( x^n - m \right) ^2<br>$$</p>
<p>而后计算$s^2$的期望值<br>$$<br>E\left[ s^2 \right] = \frac{N-1}{N} \sigma^2<br>$$</p>
<p>说明普遍而言，$s$要比$\sigma$的值小，这是<strong>有偏差的估计</strong>。</p>
<p><img src="chapter5-6.png" alt=""></p>
<p>增大$N$的值，那么$s$和$\sigma$之间估测的差距就会变小。</p>
<p><img src="chapter5-7.png" alt=""></p>
<h2 id="为什么会有很多的模型"><a href="#为什么会有很多的模型" class="headerlink" title="为什么会有很多的模型?"></a>为什么会有很多的模型?</h2><p>讨论系列02中的案例：这里假设是在平行宇宙中，抓了不同的神奇宝贝</p>
<p><img src="chapter5-8.png" alt=""></p>
<p>用同一个model，在不同的训练集中找到的 $f^∗$ 就是不一样的</p>
<p><img src="chapter5-9.png" alt=""></p>
<p>这就像在靶心上射击，进行了很多组（一组多次）。现在需要知道它的散布是怎样的，将100个宇宙中的model画出来</p>
<p><img src="chapter5-10.png" alt=""></p>
<p>不同的数据集之前什么都有可能发生。</p>
<h3 id="考虑不同模型的方差"><a href="#考虑不同模型的方差" class="headerlink" title="考虑不同模型的方差"></a>考虑不同模型的方差</h3><p>一次模型的方差就比较小的，也就是是比较集中，离散程度较小。而5次模型的方差就比较大，同理散布比较广，离散程度较大。</p>
<p>所以用比较简单的模型，方差是比较小的（就像射击的时候每次的时候，每次射击的设置都集中在一个比较小的区域内）。如果用了复杂的模型，方差就很大，散布比较开。</p>
<p>这也是因为简单的模型受到不同训练集的影响是比较小的。</p>
<h3 id="考虑不同模型的偏差"><a href="#考虑不同模型的偏差" class="headerlink" title="考虑不同模型的偏差"></a>考虑不同模型的偏差</h3><p><img src="chapter5-11.png" alt=""></p>
<p>这里没办法知道真正的 $\hat{f}$，所以假设图中的那条黑色曲线为真正的 $\hat{f}$</p>
<p>结果可视化，一次平均的 $\bar{f}$ 没有5次的好，虽然5次的整体结果离散程度很高。</p>
<p>一次模型的偏差比较大，而复杂的5次模型，偏差就比较小。</p>
<p><img src="002.png" alt=""></p>
<p>直观的解释：简单的模型函数集的space比较小，所以可能space里面就没有包含靶心，肯定射不中。而复杂的模型函数集的space比较大，可能就包含的靶心，只是没有办法找到确切的靶心在哪，但足够多的，就可能得到真正的function。</p>
<h3 id="偏差v-s-方差"><a href="#偏差v-s-方差" class="headerlink" title="偏差v.s.方差"></a>偏差v.s.方差</h3><p><img src="chapter5-12.png" alt=""></p>
<p>将系列02中的误差拆分为偏差和方差。</p>
<ul>
<li>简单模型（左边）是偏差比较大造成的误差，这种情况叫做<strong>欠拟合</strong>。</li>
<li>复杂模型（右边）是方差过大造成的误差，这种情况叫做<strong>过拟合</strong>。</li>
</ul>
<h1 id="怎么判断？"><a href="#怎么判断？" class="headerlink" title="怎么判断？"></a>怎么判断？</h1><h2 id="分析"><a href="#分析" class="headerlink" title="分析"></a>分析</h2><p><img src="chapter5-13.png" alt=""></p>
<p>如果模型没有很好的训练训练集，就是偏差过大，也就是欠拟合。</p>
<p>如果模型很好的训练训练集，即再训练集上得到很小的错误，但在测试集上得到大的错误，这意味着模型可能是方差比较大，就是过拟合。</p>
<p>对于欠拟合和过拟合，是用不同的方式来处理的</p>
<h3 id="偏差大-欠拟合"><a href="#偏差大-欠拟合" class="headerlink" title="偏差大-欠拟合"></a>偏差大-欠拟合</h3><p>此时应该重新设计模型。因为之前的函数集里面可能根本没有包含$f^*$。可以：</p>
<ul>
<li>将更多的函数加进去，比如考虑高度重量，或者HP值等等。</li>
<li>考虑更多次幂、更复杂的模型。</li>
<li>如果此时强行再收集更多的data去训练，这是没有什么帮助的，因为设计的函数集本身就不好，再找更多的训练集也不会更好。</li>
</ul>
<h3 id="方差大-过拟合"><a href="#方差大-过拟合" class="headerlink" title="方差大-过拟合"></a>方差大-过拟合</h3><ul>
<li>简单粗暴的方法：更多的数据</li>
</ul>
<p>但是很多时候不一定能做到收集更多的data，可以针对对问题的理解对数据集做调整。</p>
<p>比如识别手写数字的时候，偏转角度的数据集不够，那就将正常的数据集左转15度，右转15度，类似这样的处理。</p>
<ul>
<li>正则化</li>
</ul>
<p>可能伤害偏差，让Model中不包含理想模型，所以要权衡。</p>
<p><img src="chapter5-14.png" alt=""></p>
<h1 id="模型选择"><a href="#模型选择" class="headerlink" title="模型选择"></a>模型选择</h1><p>现在在偏差和方差之间就需要一个权衡，想选择的模型，可以平衡偏差和方差产生的错误，使得总错误最小。</p>
<p>但是下面这件事最好不要做：</p>
<p><img src="chapter5-15.png" alt=""></p>
<p>用训练集训练不同的模型，然后在测试集上比较错误，模型3的错误比较小，就认为模型3好。但实际上这只是你手上的测试集，真正完整的测试集并没有。比如在已有的测试集上错误是0.5，但有条件收集到更多的测试集后通常得到的错误都是大于0.5的。</p>
<h2 id="交叉验证"><a href="#交叉验证" class="headerlink" title="交叉验证"></a>交叉验证</h2><p><img src="chapter5-16.png" alt=""></p>
<p>图中public的测试集是已有的，private是没有的，不知道的。</p>
<p><strong>交叉验证</strong>就是将训练集再分为两部分，一部分作为训练集，一部分作为验证集。</p>
<p>用训练集训练模型，然后再验证集上比较，确实出最好的模型之后（比如模型3），再用全部的训练集训练模型3，然后再用public的测试集进行测试，此时一般得到的错误都是大一些的。</p>
<p>不过此时会比较想再回去调一下参数，调整模型，让在public的测试集上更好，但<strong>不太推荐这样</strong>。</p>
<hr>
<p>上述方法可能会担心将训练集拆分的时候分的效果比较差怎么办，可以用下面的方法。</p>
<h2 id="N-折交叉验证"><a href="#N-折交叉验证" class="headerlink" title="N-折交叉验证"></a>N-折交叉验证</h2><p>将训练集分成N份，比如分成3份。</p>
<p><img src="chapter5-17.png" alt=""></p>
<p>比如在三份中训练结果Average错误是模型1最好，再用全部训练集训练模型1。</p>

        </div>

        
        <section class="post-tags">
            <div>
                <span>标签：</span>
                <span class="tag">
                    
                    
                        <a href="/tags/%E6%9D%8E%E5%AE%8F%E6%AF%85/"># 李宏毅</a>&nbsp;&nbsp;
                    
                        <a href="/tags/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/"># 机器学习</a>&nbsp;&nbsp;
                    
                        <a href="/tags/AI/"># AI</a>&nbsp;&nbsp;
                    
                        
                </span>
            </div>
            <div>
                <a href="javascript:window.history.back();">返回</a>
                <span>· </span>
                <a href="/">主页</a>
            </div>
        </section>
        <section class="post-nav">
            
                <a class="prev" rel="prev" href="/2017/03/13/ai-lhyML-06/">「AI_06」梯度下降法</a>
            
            
            <a class="next" rel="next" href="/2017/03/13/ai-lhyML-04/">「AI_04」回归演示</a>
            
        </section>


    </article>
</div>

        </div>
        <footer id="footer" class="footer">
    <div class="copyright">
        <span>© 豆豆 | Powered by <a href="https://hexo.io" target="_blank">Hexo</a> & <a href="https://github.com/Siricee/hexo-theme-Chic" target="_blank">Chic</a></span>
    </div>
</footer>


    <script src='https://unpkg.com/mermaid@7.1.2/dist/mermaid.min.js'></script>
    <script>
      if (window.mermaid) {
        mermaid.initialize({theme: 'neutral'});
      }
    </script>
  
    </div>
</body>
</html>
